/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package util;

import dao.Dao;
import entidades.Campeonato;
import entidades.Endereco;
import entidades.Jogo;
import entidades.Rodada;
import entidades.TimeFutebol;
import entidades.Usuario;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;

/**
 *
 * @author Familia Genu
 */
public class Util {

    private static SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
    private static SimpleDateFormat timeFormat = new SimpleDateFormat("hh:mm");
    private static SimpleDateFormat dateTimeFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm");

    public static String dateTimeToString(Date data) {
        return dateTimeFormat.format(data);
    }

    public static Date stringToDateTime(String data) {
        try {
            return dateTimeFormat.parse(data);
        } catch (ParseException ex) {
            Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    public static String dateToString(Date data) {
        return dateFormat.format(data);
    }

    public static Date stringToDate(String data) {
        try {
            return dateFormat.parse(data);
        } catch (ParseException ex) {
            Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    public static String timeToString(Date data) {
        return timeFormat.format(data);
    }

    public static Date stringToTime(String data) {
        try {
            return timeFormat.parse(data);
        } catch (ParseException ex) {
            Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    /**
     * Verifica se um texto é composto por números.
     * @param text Texto a ser verificado.
     * @return True se texto é composto por números. False em caso contrário.
     */
    public static boolean isNumber(String text) {
        for (int i = 0; i < text.length(); i++) {
            if (!Character.isDigit(text.charAt(i))) {
                return false;
            }
        }
        return true;
    }

    /**
     * Verifica se um texto é composto por números formato dinheiro.
     * @param text Texto a ser verificado.
     * @return True se texto é composto por números formato dinheiro. False em caso contrário.
     */
    public static boolean isMoney(String text) {
        text = text.replaceAll(",", ".").replaceAll(".", "");
        for (int i = 0; i < text.length(); i++) {
            if (!Character.isDigit(text.charAt(i))) {
                return false;
            }
        }
        return true;
    }

    /**
     * Verifica se um texto é composto por letras.
     * @param text Texto a ser verificado.
     * @return True se texto é composto por letras. False em caso contrário.
     */
    public static boolean isLetter(String text) {
        text = text.trim().replaceAll(" ", "");
        for (int i = 0; i < text.length(); i++) {
            if (!Character.isLetter(text.charAt(i))) {
                return false;
            }
        }

        return true;
    }

    /**
     * Verifica se um texto é composto por números ou letras.
     * @param text Texto a ser verificado.
     * @return True se texto é composto por números ou letras. False em caso contrário.
     */
    public static boolean isLetterOrNumber(String text) {
        for (int i = 0; i < text.length(); i++) {
            if (!Character.isLetterOrDigit(text.charAt(i))) {
                return false;
            }
        }
        return true;
    }

    /**
     * Remove e cria a base de dados no MySQL.
     * @param dataBase Nome da base de dados.
     * @param user Usuario do banco de dados.
     * @param password Senha do banco de dados.
     * @return True se base de dados foi criada. False em caso contrario.
     */
    public static boolean recreateDataBase(String dataBase, String user, String password) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost";
            Connection connection = DriverManager.getConnection(url, user, password);
            Statement statement = connection.createStatement();
            statement.execute("DROP DATABASE IF EXISTS " + dataBase);
            statement.execute("CREATE DATABASE " + dataBase);
            statement.close();
            connection.close();
            return true;
        } catch (Exception ex) {
            Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Converte um array de bytes para um objeto ImageIcon.
     * @param imageData Array de bytes com os dados da imagem.
     * @return Objeto ImagemIcon com a imagem.
     */
    public static ImageIcon byteArrayToImageIcon(byte[] imageData) {
        ObjectInputStream objectInputStream = null;
        try {
            ByteArrayInputStream byteArray = new ByteArrayInputStream(imageData);
            objectInputStream = new ObjectInputStream(byteArray);
            return (ImageIcon) objectInputStream.readObject();

        } catch (Exception ex) {
            Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                objectInputStream.close();
            } catch (IOException ex) {
                Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }

    /**
     * Converte um objeto ImageIcon para um array de bytes.
     * @param icon Objeto ImagemIcon com a imagem.
     * @return Array de bytes com os dados da imagem.
     */
    public static byte[] imageIconToByteArray(ImageIcon icon) {
        try {
            ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArray);
            objectOutputStream.writeObject(icon);
            objectOutputStream.flush();
            return byteArray.toByteArray();
        } catch (IOException ex) {
            Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    public static String montaComboboxEstado() {
        String aux = "<option>Selecione um Estado</option>\n"
                + "<option>Acre</option>\n"
                + "<option>Alagoas</option>\n"
                + "<option>Amapa</option>\n"
                + "<option>Amazonas</option>\n"
                + "<option>Bahia</option>\n"
                + "<option>Ceara</option>\n"
                + "<option>Distrito Federal</option>\n"
                + "<option>Espirito Santo</option>\n"
                + "<option>Goias</option>\n"
                + "<option>Maranhao</option>\n"
                + "<option>Mato Grosso</option>\n"
                + "<option>Mato Grosso do Sul</option>\n"
                + "<option>Minas Gerais</option>\n"
                + "<option>Para</option>\n"
                + "<option>Paraiba</option>\n"
                + "<option>Parana</option>\n"
                + "<option>Pernambuco</option>\n"
                + "<option>Piaui</option>\n"
                + "<option>Rio de Janeiro</option>\n"
                + "<option>Rio Grande do Norte</option>\n"
                + "<option>Rio Grande do Sul</option>\n"
                + "<option>Rondonia</option>\n"
                + "<option>Roraima</option>\n"
                + "<option>Santa Catarina</option>\n"
                + "<option>Sao Paulo</option>\n"
                + "<option>Sergipe</option>\n"
                + "<option>Tocantins</option>";
        return aux;
    }

    public static String montaComboboxEstado(String estado) {
        String aux = "<option>Selecione um Estado</option>\n"
                + "<option>Acre</option>\n"
                + "<option>Alagoas</option>\n"
                + "<option>Amapa</option>\n"
                + "<option>Amazonas</option>\n"
                + "<option>Bahia</option>\n"
                + "<option>Ceara</option>\n"
                + "<option>Distrito Federal</option>\n"
                + "<option>Espirito Santo</option>\n"
                + "<option>Goias</option>\n"
                + "<option>Maranhao</option>\n"
                + "<option>Mato Grosso</option>\n"
                + "<option>Mato Grosso do Sul</option>\n"
                + "<option>Minas Gerais</option>\n"
                + "<option>Para</option>\n"
                + "<option>Paraiba</option>\n"
                + "<option>Parana</option>\n"
                + "<option>Pernambuco</option>\n"
                + "<option>Piaui</option>\n"
                + "<option>Rio de Janeiro</option>\n"
                + "<option>Rio Grande do Norte</option>\n"
                + "<option>Rio Grande do Sul</option>\n"
                + "<option>Rondonia</option>\n"
                + "<option>Roraima</option>\n"
                + "<option>Santa Catarina</option>\n"
                + "<option>Sao Paulo</option>\n"
                + "<option>Sergipe</option>\n"
                + "<option>Tocantins</option>";
        String[] options = aux.split("\n");
        aux = "";
        for (String string : options) {
            if (string.substring(8, string.lastIndexOf("<")).equals(estado)) {
                string = string.replace("<option>", "<option selected=\"selected\">");
            }
            aux += string;
        }

        return aux;
    }

    public static void iniciaBanco(boolean recreate) {
        if (recreate) {
            recreateDataBase("aluno", "aluno", "aluno");
        }
        if (new Dao<Usuario>(Usuario.class).list().isEmpty()) {
            Usuario u = new Usuario();
            u.setAdministrador(true);
            u.setEmail("marcokuchla@gmail.com");
            u.setUsuario("makb");
            u.setSenha("mbraga93");
            u.setNome("Marco Antonio Kuchla Braga");
            u.setCpf("045.315.889-75");
            u.setNascimento(stringToDate("12/06/1993"));
            u.setPontos(0);
            Endereco e = new Endereco();
            e.setPais("Brasil");
            e.setEstado("Parana");
            e.setCidade("Campo Mourao");
            e.setLogradouro("Rua Santa Catarina");
            e.setNumero("2570");
            new Dao<Endereco>(Endereco.class).insert(e);
            u.setEndereco(e);
            new Dao<Usuario>(Usuario.class).insert(u);

            u = new Usuario();
            u.setAdministrador(true);
            u.setEmail("filipegomesgenu@gmail.com");
            u.setUsuario("fyote");
            u.setSenha("fyote123");
            u.setNome("Filipe Gomes Genu");
            u.setCpf("081.205.269-29");
            u.setNascimento(stringToDate("26/08/1992"));
            u.setPontos(0);
            e = new Endereco();
            e.setPais("Brasil");
            e.setEstado("Parana");
            e.setCidade("Campo Mourao");
            e.setLogradouro("Avenida Manuel Mendes de Camargo");
            e.setNumero("2171");
            new Dao<Endereco>(Endereco.class).insert(e);
            u.setEndereco(e);
            new Dao<Usuario>(Usuario.class).insert(u);

            u = new Usuario();
            u.setAdministrador(false);
            u.setEmail("user@gmail.com");
            u.setUsuario("user");
            u.setSenha("user123");
            u.setNome("User");
            u.setCpf("111.111.111-11");
            u.setNascimento(stringToDate("11/11/1111"));
            u.setPontos(0);
            e = new Endereco();
            e.setPais("asd");
            e.setEstado("Parana");
            e.setCidade("asd");
            e.setLogradouro("asd");
            e.setNumero("1111");
            new Dao<Endereco>(Endereco.class).insert(e);
            u.setEndereco(e);
            new Dao<Usuario>(Usuario.class).insert(u);

            povoaTabelas();
        }
    }

    private static void povoaTabelas() {
        povoaTimes();
        povoaCampeonatos();
        povoaRodadas();
        povoaJogos();
    }

    private static void povoaTimes() {
        String aux =
                "America-MG\n"
                + "Atletico-GO\n"
                + "Atletico-MG\n"
                + "Atletico-PR\n"
                + "Avai\n"
                + "Bahia\n"
                + "Botafogo\n"
                + "Ceara\n"
                + "Corinthians\n"
                + "Coritiba\n"
                + "Cruzeiro\n"
                + "Figueirense\n"
                + "Flamengo\n"
                + "Fluminense\n"
                + "Gremio\n"
                + "Internacional\n"
                + "Palmeiras\n"
                + "Santos\n"
                + "Sao Paulo\n"
                + "Vasco";
        String nomes[] = aux.split("\n");
        for (String nome : nomes) {
            TimeFutebol tf = new TimeFutebol();
            tf.setNome(nome);
            new Dao<TimeFutebol>(TimeFutebol.class).insert(tf);
        }
    }

    private static void povoaCampeonatos() {
        Campeonato c = new Campeonato();
        c.setNome("Brasileiro Serie A");
        c.setMaxTimes(20);
        c.setTimes(new Dao<TimeFutebol>(TimeFutebol.class).list());
        new Dao<Campeonato>(Campeonato.class).insert(c);
    }

    private static void povoaRodadas() {
        Campeonato c = new Dao<Campeonato>(Campeonato.class).get(1);
        for (int i = 1; i <= 38; i++) {
            Rodada r = new Rodada();
            r.setNumero(i);
            r.setCampeonato(c);
            r.setInicio(new Date());
            r.setTermino(new Date(r.getInicio().getTime() + 3600 * 24 * 2 * 1000));
            r.setInicioPalpites(new Date());
            r.setTerminoPalpites(new Date(r.getTermino().getTime() - 3600 * 6 * 1000));
            new Dao<Rodada>(Rodada.class).insert(r);
        }
    }

    private static void povoaJogos() {

        List<TimeFutebol> timesMandantes = new Dao<TimeFutebol>(TimeFutebol.class).list();
        List<TimeFutebol> timesVisitantes = new Dao<TimeFutebol>(TimeFutebol.class).list();
        int k = 1;
        for (int i = 0; i < timesMandantes.size() - 1; i += 2) {
            Rodada rodada = new Dao<Rodada>(Rodada.class).get(k);
            Rodada rodadaVolta = new Dao<Rodada>(Rodada.class).get(k + 19);
            //for (int j = i + 1; j < timesVisitantes.size(); j += 2) {
            Jogo jogo = new Jogo();
            jogo.setAtivo(true);
            jogo.setMandante(timesMandantes.get(i));
            jogo.setVisitante(timesVisitantes.get(i + 1));
            jogo.setGolMandante(-1);
            jogo.setGolVisitante(-1);
            jogo.setDataHora(new Date(rodada.getInicioPalpites().getTime() + 3600 * 2 * 1000));
            jogo.setRodada(rodada);
            new Dao<Jogo>(Jogo.class).insert(jogo);
            Jogo volta = new Jogo();
            volta.setAtivo(true);
            volta.setMandante(timesVisitantes.get(i + 1));
            volta.setVisitante(timesMandantes.get(i));
            volta.setGolMandante(-1);
            volta.setGolVisitante(-1);
            volta.setDataHora(new Date(rodadaVolta.getInicioPalpites().getTime() + 3600 * 3 * 1000));
            volta.setRodada(rodadaVolta);
            new Dao<Jogo>(Jogo.class).insert(volta);
            //}
        }
    }
}
